
#include "AppelFonction.h"
#include "Parametre.h"
#include "Identifiant.h"

AppelFonction::AppelFonction():m_identifiant(new Identifiant()){

}

// Destructeur qui détruit les variables allouées dynamiquement

AppelFonction::~AppelFonction(){
	delete m_identifiant;
	int i;
	for(i=0 ; i < m_parametres.size(); ++i){
		delete m_parametres.at(i);
	}
}

//Permet d'ajouter une ligne de code Lobo qui sera ensuite traduit dans la fonction analysé

void AppelFonction::addCodeLobo(std::string lobo) {
	m_codeLobo = lobo;
}

// Fonction qui analyse le code Lobo et permet d'instancier les classes Nombre et/ou Identifiant

void AppelFonction::analyser() {
	m_codeLobo = TraitementChaine::clearPV(m_codeLobo);
	std::stringstream ss;
	ss << m_codeLobo;
	std::string s;

	getline(ss, s, ' ');

	if(s.compare("APPEL")==0){

		getline(ss, s, ' ');
		m_identifiant->setParametre(s);
		int i = 0;
		while(getline(ss, s, ' ')){
			if(TraitementChaine::is_int(s)){
				m_parametres.push_back(new Nombre());
				m_parametres.at(i)->setParametre(s);
			}else{
				m_parametres.push_back(new Identifiant());
				m_parametres.at(i)->setParametre(s);
			}
			++i;
		}
	}
}

// Fonction qui permet de retourner un appel de fonction dans le langage C++

std::string AppelFonction::toString() const {
	std::string s;
	s+= m_identifiant->toString()+"(";
	int i;
	for(i=0 ; i < m_parametres.size(); ++i){
		s+=" "+m_parametres.at(i)->toString();
		if(i<m_parametres.size()-1){
			s+=",";
		}
	}
	s+=" ) ;";

	return s;
}

